package org.tri.gui.worker;

import org.tri.entity.Establecimiento;
import org.tri.entity.Productor;
import org.tri.gui.worker.exceptions.EstablecimientoDuplicadoException;
import org.tri.persistence.search.BusquedaEstablecimiento;

/**
 * La clase {@code EstablecimientoPersistentWorker} es un worker/persister 
 * específico para la clase {@code Establecimiento} ya que necesita que se 
 * realicen algunas acciones previas a la persistencia.
 * @author kiira
 * @version 1.0, Feb 17, 2012
 */
public class EstablecimientoPersistenceWorker extends PersistenceWorker {

    /** Productor a asignar al establecimiento. */
    private Productor productor;
    /** Renspa a asignar al establecimiento. */
    private long renspa;
    /** Cuig a asignar al establecimiento. */
    private String cuig;

    /**
     * Inicializa el worker para persistir un establecimiento, asignando
     * previamente el productor indicado.
     * @param establecimiento establecimiento a persistir.
     * @param productor productor a asignar al establecimiento.
     * @param renspa renspa a asignar al establecimiento.
     * @paran cuig cuig a asignar al establecimiento.
     */
    public EstablecimientoPersistenceWorker( Establecimiento establecimiento, 
                                             Productor productor, long renspa,
                                             String cuig ) {
        super( establecimiento );
        this.productor = productor;
        this.renspa = renspa;
        this.cuig = cuig;

    }//end constructor

    /**
     * {@inheritDoc}
     */
    @Override
    protected Object doInBackground() throws Exception {
        Establecimiento establecimiento = (Establecimiento)objectToSave;
        
        //previo a cualquier tarea de guardado, comprobamos que los valores
        //de la renspa y el cuig sean UNICOS
        BusquedaEstablecimiento busqueda = new BusquedaEstablecimiento();
        busqueda.porRenspaExacto( renspa );
        
        Establecimiento estEncontrado = busqueda.resultadoUnico();
        
        if ( estEncontrado != null && estEncontrado != establecimiento )
            throw new EstablecimientoDuplicadoException(
                    String.format( "Ya existe un establecimiento con RENSPA %d",
                                   renspa ) );
        
        busqueda = new BusquedaEstablecimiento();
        busqueda.porCuig( cuig );
        
        estEncontrado = busqueda.resultadoUnico();
        
        if ( estEncontrado != null && estEncontrado != establecimiento )
            throw new EstablecimientoDuplicadoException( 
                    "Ya existe un establecimiento con CUIG " 
                    + cuig );
                
        //productor previo del establecimiento (si lo tuviera)
        Productor prodAnterior = establecimiento.getProductor();

        //si el productor cambio
        if ( !productor.equals( prodAnterior ) ) {
            //si ya estaba asignado a un productor
            if ( prodAnterior != null )
                //quitamos el establecimiento del productor anterior
                establecimiento.getProductor().
                        getEstablecimientos().
                        remove( establecimiento );

            //asignamos el nuevo prouctor
            productor.agregarEstablecimiento( establecimiento );

        }//end if
        
        //asignamos la renspa y el cuig
        establecimiento.setRenspa( renspa );
        establecimiento.setCuig( cuig );

        //hacemos persistentes los cambios
        return super.doInBackground();

    }//end método doInBackground

}//end clase EstablecimientoPersistenceWorker
